home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
FROMUTS
/
UNIXLIB37B
/
src
/
c
/
termcap
< prev
Wrap
Text File
|
1992-03-01
|
14KB
|
837 lines
#ifdef __STDC__
static char sccs_id[] = "@(#) termcap.c 5.6 "__DATE__" HJR";
#else
static char sccs_id[] = "@(#) termcap.c 5.6 25/2/92 HJR";
#endif
/* termcap.c (c) Copyright 1989/1990/1991/1992 H.Rogers */
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifdef __STDC__ /* implies ANSI C compilation */
#include <stdlib.h>
#else
char *getenv();
char *malloc();
extern long strtol();
#define const
#endif
#include "termcap.h"
#ifdef ARCH
#define T_BUILTIN /* builtin termcap */
static char *t_bname = "acorn0";
static unsigned char *t_btenv = (unsigned char *)
"av|acorn0|Acorn VDU Driver Mode 0:"
":li#32:co#80:am:cl=^L:bs:cm=^_%r%.%.:up=^K:ho=^^:bl=^G:bw:"
":ce=^W^H^E^F\\200\\200\\200\\200\\200\\200:"
":so=^W^Q^E\\200\\200\\200\\200\\200\\200\\200:"
":se=^W^Q^E\\200\\200\\200\\200\\200\\200\\200:"
":sb=^W^G^A^B\\200\\200\\200\\200\\200\\200:"
":sf=^W^G^A^C\\200\\200\\200\\200\\200\\200:"
":is=^C^F^D^O^V\\200:";
#endif
#define T_IOCTL /* use TIOCGWINSIZ to get LI,CO */
#ifdef T_IOCTL
#include "termio.h"
#ifdef __STDC__
extern int ioctl(int,int,void *);
#else
extern int ioctl();
#endif
#endif
/* #define T_TEST */ /* test main() */
/* #define T_DEBUG */ /* debugging output to t_debug */
#define T_FILE "/etc/termcap" /* the database file */
#ifdef __STDC__
static int t_tgetnam(unsigned char **,unsigned char **);
static int t_tgetln(FILE *,unsigned char *);
static int t_tentcp(unsigned char *);
static unsigned char *t_tgetid(char *);
static unsigned char t_tcoord(int,unsigned int *);
#else
static int t_tgetnam(); /* extracts the next name from entry */
static int t_tgetln(); /* reads line from termcap file */
static int t_tentcp(); /* copies the termcap entry into bp */
static unsigned char *t_tgetid(); /* returns a pointer to a capability */
static unsigned char t_tcoord(); /* converts a coord to an output val */
#endif /* __STDC__ */
#define MAXTC 64 /* max. tc indirections */
static char __PC,*__BC,*__UP;
static char *t_tbp;
static unsigned char *t_tbpstart;
static int t_recurs,t_tbpspace;
static unsigned char *t_tenv;
#ifdef T_DEBUG
static FILE *t_debug;
#endif
/* tgetent() */
int tgetent(bp,name)
char *bp,*name;
{
unsigned char *tenv,*tent,*tentbuf,tc;
unsigned char *tp1,*tp2;
char *fnam;
FILE *tfile = 0;
int nbyt,rval;
#ifdef T_DEBUG
if (!t_recurs)
{
if (!(t_debug = fopen("t_debug","w"))) return(-1);
setvbuf(t_debug,(char *)0,_IONBF,BUFSIZ);
}
#endif
if (!(t_tbp = bp)) return(-1);
if (!name)
#ifdef T_BUILTIN
#ifdef T_DEBUG
fputs("tgetent(\"(null)\")\n",t_debug);
#endif
name = t_bname;
#else
return(-1);
#endif
fnam = T_FILE;
if (!t_recurs) t_tbpspace = 1024;
if (!t_recurs)
{
char *t = getenv("TERM");
if (!t) t = "";
if (!strcmp(name,t))
t_tenv = (unsigned char *)getenv("TERMCAP");
else
t_tenv = 0;
}
if (tenv = t_tenv)
{
if (!t_recurs && *tenv != '/')
{
#ifdef T_BUILTIN
builtin:
#endif
while (isspace(*tenv)) tenv++;
tp1 = tp2 = tenv;
#ifdef T_DEBUG
fprintf(t_debug,"tgetent(\"%s\") < $TERMCAP\n",name);
#endif
while(t_tgetnam(&tp1,&tp2))
{
tc = *tp2; *tp2 = 0;
#ifdef T_DEBUG
fprintf(t_debug,"t_tgetnam(): %s\n",(char *)tp1);
#endif
if (!strcmp((char *)tp1,name))
{
*tp2 = tc;
#ifdef T_DEBUG
fputs("t_tgetnam() - MATCH -\n",t_debug);
#endif
if (strlen((char *)tenv) > t_tbpspace) return(-1);
return(t_tentcp(tenv) ? -1 : 1);
}
else
*tp2 = tc;
}
}
else if (*tenv == '/')
{
#ifdef T_DEBUG
fprintf(t_debug,"tgetent(\"%s\") < %s\n",name,(char *)tenv);
#endif
fnam = (char *)tenv;
}
}
#ifdef T_DEBUG
if (fnam != (char *)t_tenv)
fprintf(t_debug,"tgetent(\"%s\") < /etc/termcap\n",name);
#endif
if (!(tfile = fopen(fnam,"r")))
#ifdef T_BUILTIN
{
if (fnam != (char *)t_tenv && !strcmp(name,t_bname))
{ tenv = t_btenv; goto builtin; }
else
return(-1);
}
#else
return(-1);
#endif
tent = tentbuf = (unsigned char *)malloc(1024);
while (nbyt = t_tgetln(tfile,tent))
{
if (*tent != '#')
{
while (isspace(*tent)) tent++;
tp1 = tp2 = tent;
while(t_tgetnam(&tp1,&tp2))
{
tc = *tp2; *tp2 = 0;
#ifdef T_DEBUG
fprintf(t_debug,"t_tgetnam(): %s\n",(char *)tp1);
#endif
if (!strcmp((char *)tp1,name))
{
*tp2 = tc;
#ifdef T_DEBUG
fprintf(t_debug,"t_tgetnam() - MATCH -\n");
fprintf(t_debug,"t_tgetnam(): [%d (%d)] %s\n",nbyt,t_tbpspace,tent);
#endif
if (nbyt > t_tbpspace || nbyt < 0)
{ free((char *)tentbuf); return(-1); }
if (tfile) { fclose(tfile); tfile = 0; }
rval = t_tentcp(tent);
free((char *)tentbuf);
return(rval ? -1 : 1);
}
else
*tp2 = tc;
}
}
}
if (tfile) { fclose(tfile); tfile = 0; }
free((char *)tentbuf);
return(0);
}
/* t_tgetnam() */
static int t_tgetnam(t1,t2)
unsigned char **t1,**t2;
{
register unsigned char *tp1 = *t1,*tp2 = *t2;
while ((*tp2 == '|') || isspace(*tp2)) tp2++;
if (*tp2 == ':') return(0);
tp1 = tp2;
while ((*tp2 != '|') && (*tp2 != ':')) tp2++;
*t1 = tp1; *t2 = tp2;
return(-1);
}
/* t_tentcp() */
static int t_tentcp(s)
unsigned char *s;
{
register unsigned char *s1,*s2,*sp;
char *t_tbp_;
char *tcnam,*tcn;
#ifdef T_DEBUG
fputs("t_tentcp()\n",t_debug);
#endif
tcnam = (char *)malloc(256);
s1 = (unsigned char *)t_tbp;
s2 = s;
while (*s2)
{
if (*s2 == ':') /* strips out empty capabilities :: */
{
sp = s2 + 1;
while (isspace(*sp)) sp++;
if (*sp == ':') s2 = sp;
}
*s1++ = *s2++;
}
*s1 = 0;
if (!t_recurs)
{
sp = (unsigned char *)t_tbp;
while (*sp++ != ':');
t_tbpstart = sp;
}
if (sp = t_tgetid("tc"))
{
#ifdef T_DEBUG
fprintf(t_debug,"tgetent()# %d\n",t_recurs);
#endif
if (++t_recurs > (MAXTC - 1))
{ free(tcnam); return(-1); }
t_tbp_ = t_tbp;
tcn = tcnam;
s1 = sp = sp-2;
t_tbpspace -= (int)(s1 - (unsigned char *)t_tbp);
if (tgetent((char *)s1,tgetstr("tc",&tcn)) < 1)
{ free(tcnam); return(-1); }
while (*sp++ != ':');
while (*s1++ = *sp++);
t_tbp = t_tbp_;
t_recurs--;
}
#ifdef T_DEBUG
fprintf(t_debug,"tgetent(): %s\n",t_tbp);
#endif
if (!t_recurs)
{
__PC = 0; __BC = "\b"; __UP = "\v";
}
free(tcnam);
return(0);
}
/* t_tgetln() */
static int t_tgetln(tfile,buf)
FILE *tfile;
register unsigned char *buf;
{
register unsigned char *bufp;
register int nbyt;
bufp = buf;
nbyt = 0;
while (-1)
{
if (!fgets((char *)bufp,t_tbpspace - nbyt,tfile)) return(nbyt);
while (*bufp++); bufp--;
if (*--bufp != '\n') ++bufp;
nbyt += (bufp - buf);
if (!nbyt) continue;
if (*--bufp != '\\') { *++bufp = 0; return(nbyt); }
buf = bufp; nbyt--;
}
}
/* t_tgetid() */
static unsigned char *t_tgetid(id)
register char *id;
{
register unsigned char *bptr;
int found;
if ((!id) || (!t_tbpstart)) return(0);
bptr = t_tbpstart;
while (*bptr)
{
found = (((unsigned char)*id++ == *bptr++) ? \
((unsigned char)*id == *bptr) : 0);
bptr++; id--;
if (found)
{
if (*bptr == '@') return(0);
else return(bptr);
}
while ((*bptr != ':') && (*bptr != 0)) bptr++;
if (*bptr == ':') bptr++;
}
return(0);
}
/* tgetnum() */
int tgetnum(id)
char *id;
{
register unsigned char *eptr;
int rval;
#ifdef TIOCGWINSZ
if (rval = (!strncmp(id,"li",2) ? 1 : (!strncmp(id,"co",2) ? -1 : 0)))
{
struct winsize w[1];
ioctl(2,TIOCGWINSZ,w);
return((rval > 0) ? w->ws_row : w->ws_col);
}
#endif
if (!(eptr = t_tgetid(id))) return(-1);
if (*eptr++ != '#') return(0);
rval = atoi((const char *)eptr);
#ifdef T_DEBUG
fprintf(t_debug,"tgetnum(\"%s\"): %d\n",id,rval);
#endif
return(rval);
}
/* tgetflag() */
int tgetflag(id)
char *id;
{
register unsigned char *idp;
#ifdef T_DEBUG
int rval;
idp = t_tgetid(id);
rval = (idp ? ((*idp != '@') ? 1 : 0) : 0);
fprintf(t_debug,"tgetflag(\"%s\"): %d\n",id,rval);
return(rval);
#else
idp = t_tgetid(id);
return(idp ? ((*idp != '@') ? 1 : 0) : 0);
#endif
}
/* tgetstr() */
char *tgetstr(id,area)
char *id,**area;
{
register unsigned char *eptr,*aptr;
unsigned char obuf[4];
char *rval;
#ifdef T_DEBUG
fprintf(t_debug,"tgetstr(\"%s\")\n",id);
#endif
if (!(area ? *area : 0))
{
rval = 0;
goto tgetstr_ret;
}
aptr = (unsigned char *)*area;
if (!(eptr = t_tgetid(id))) return(0);
if (*eptr++ != '=')
{
*aptr = 0;
return(0);
}
if ((*eptr >= '0') && (*eptr <= '9'))
{
while ((*eptr >= '0') && (*eptr <= '9')) *aptr++ = *eptr++;
if (*eptr == '*') *aptr++ = *eptr++;
}
obuf[3] = 0;
while ((*eptr != ':') && (*eptr != 0))
{
switch (*eptr)
{
case '\\':
switch (*++eptr)
{
case 'E':
*aptr = 0x1b;
break;
case 'n':
*aptr = 0x0a;
break;
case 'r':
*aptr = 0x0d;
break;
case 't':
*aptr = 0x09;
break;
case 'b':
*aptr = 0x08;
break;
case 'f':
*aptr = 0x0c;
break;
case '0':
case '1':
case '2':
case '3':
obuf[0] = *eptr++;
obuf[1] = *eptr++;
obuf[2] = *eptr;
*aptr = (char)(strtol((const char *)obuf,0,8) & 0xff);
break;
default:
*aptr = *eptr;
}
break;
case '^':
*aptr = ((*++eptr) & 0x1f);
break;
default:
*aptr = *eptr;
break;
}
eptr++; aptr++;
}
*aptr++ = 0;
rval = *area;
*area = (char *)aptr;
tgetstr_ret:
#ifdef T_DEBUG
fprintf(t_debug,"tgetstr(\"%s\"): %s\n",id,rval);
#endif
if (rval)
{
if (id[1] == 'c')
{
if (id[0] == 'b')
__BC = rval;
else if (id[0] == 'p')
__PC = *rval & 0x7f;
}
else if (id[0] == 'u' && id[1] == 'p')
__UP = rval;
else if (id[0] == 'l' && id[1] == 'e') /* terminfo compatibility */
__BC = rval;
}
return(rval);
}
static int tg_aoff,tg_coff,tg_clev;
#define TG_revxy 0001
#define TG_incxy 0002
#define TG_eorxy 0004
#define TG_bcdxy 0010
#define TG_revcod 0020
#define TG_bc 0040
#define TG_up 0100
#define TG_chkout 0200
/* tgoto() */
char *tgoto(cm,destcol,destline)
char *cm;
int destcol,destline;
{
static char rstr[256];
register char *cmp,*rstrp,*cp;
unsigned int f;
#define TC(f) (((f) & TG_revxy) ? destcol : destline)
#ifdef T_DEBUG
fprintf(t_debug,"tgoto(\"%s\",%d,%d): ",cm,destcol,destline);
if (!cm) { putc('\n',t_debug); return(0); }
#else
if (!cm) return(0);
#endif
tg_aoff = tg_coff = tg_clev = 0; f = 0;
cmp = cm;
rstrp = rstr;
while (*cmp)
{
if (*cmp == '%')
{
register int d;
register char *e;
cmp++;
switch (*cmp++)
{
case 'r':
f |= TG_revxy;
break;
case 'i':
f |= TG_incxy;
break;
case 'n':
f |= TG_eorxy;
break;
case 'B':
f |= TG_bcdxy;
break;
case 'D':
f |= TG_revcod;
break;
case '>':
tg_clev = *cmp++;
tg_coff = *cmp++;
break;
case '+':
tg_aoff = *cmp++; /* fallthru */
case '.':
f |= TG_chkout;
*rstrp++ = t_tcoord(TC(f),&f);
break;
case 'd':
d = (int)t_tcoord(TC(f),&f);
e = rstrp + 1; if (d > 9) e++; if (d > 99) e++; rstrp = e;
*e = 0; do { *--e = (d % 10) + '0'; d /= 10; } while (d);
break;
case '2':
d = (int)t_tcoord(TC(f),&f);
*rstrp = ' '; if (d > 99) *++rstrp = ' '; e = rstrp = rstrp + 2;
*e = 0; do { *--e = (d % 10) + '0'; d /= 10; } while (d);
break;
case '3':
d = (int)t_tcoord(TC(f),&f);
*rstrp = ' '; *++rstrp = ' '; e = rstrp = rstrp + 2;
*e = 0; do { *--e = (d % 10) + '0'; d /= 10; } while (d);
break;
case '%':
*rstrp++ = '%';
break;
default:
rstrp = "OOPS";
goto tgoto_ret;
break;
}
}
else *rstrp++ = *cmp++;
}
if (f & TG_bc)
{
cp = __BC;
while (*rstrp = *cp) rstrp++,cp++;
}
if (f & TG_up)
{
cp = __UP;
while (*rstrp = *cp) rstrp++,cp++;
}
*rstrp = 0;
rstrp = rstr;
tgoto_ret:
#ifdef T_DEBUG
fprintf(t_debug,"%s\n",rstrp);
#endif
return(rstrp);
}
/* t_tcoord() */
static unsigned char t_tcoord(x,_f)
register int x;
unsigned int *_f;
{
register unsigned int f;
t_tccalc:
f = (*_f);
if (x > tg_clev) x += tg_coff;
x += tg_aoff;
if (f & TG_incxy) x++;
if (f & TG_eorxy) x ^= 0140;
if (f & TG_bcdxy) x = ((x/10)<<4) | (x%10);
if (f & TG_revcod) x = (x - ((x & 15)<<1));
if (f & TG_chkout)
{
(*_f) &= (~TG_chkout);
if (!x || x == '\004' || x == '\n' || x == '\r')
{
if (f & TG_revxy)
(*_f) |= TG_bc;
else
(*_f) |= TG_up;
x++;
goto t_tccalc;
}
}
(*_f) ^= TG_revxy;
tg_aoff = 0;
return(x);
}
/* tputs() */
int tputs(cp,affcnt,outc)
register char *cp;
int affcnt;
#ifdef __STDC__
int (*outc)(char);
#else
int (*outc)();
#endif
{
register int i;
char *cpp;
int delay;
#ifdef T_DEBUG
fprintf(t_debug,"tputs(\"%s\",%d)\n",cp,affcnt);
#endif
if ((!cp) || (!outc)) return(0);
if (isdigit(*cp))
{ delay = (int)strtol(cp,&cpp,0); cp = cpp; }
else
#ifdef T_DEBUG
{ cpp = cp; delay = 0; }
#else
delay = 0;
#endif
i = *cp;
if (i == '.') while(isdigit(*++cp));
if (i == '*') { delay *= affcnt; cp++; }
if (ospeed > 13)
delay <<= (ospeed - 13);
else
delay >>= (13 - ospeed);
#ifdef T_DEBUG
fprintf(t_debug,"tputs() (pad %d): %s\n",delay,cpp);
#endif
while (i = *cp++) (*outc)(i & 0x7f);
if (ospeed) while (delay-- > 0) (*outc)(__PC);
return(0);
}
#ifdef T_TEST
char PC,*BC,*UP;
#ifdef __STDC__
static int out(char);
static void dump(char *);
#else
static int out();
static void dump();
#endif
/* main() */
#ifdef __STDC__
int main(void)
#else
int main()
#endif
{
static char bp[1024],tbuf[512];
char *tbufp,*cm;
int rval,i;
if ((rval = tgetent(bp,getenv("TERM"))) < 1)
{
fprintf(stderr,"termcap: tgetent() returned %d\n",rval);
exit(1);
}
tbufp = tbuf;
if (tgetstr("pc",&tbufp)) PC = *tbuf;
if (!(BC = tgetstr("bc",&tbufp))) BC = "\b";
UP = tgetstr("up",&tbufp);
tputs(tgetstr("cl",&tbufp),1,out);
printf("tgetent(): %s\n",bp);
printf("tgetflag(\"cm\"): %d\n",tgetflag("cm"));
printf("tgetnum(\"li\"): %d\n",tgetnum("li"));
tbufp = tbuf;
printf("tgetstr(\"cm\"): ");
dump(cm = tgetstr("cm",&tbufp));
for (i = 0; i < 10; i++)
{
tputs(tgoto(cm,i<<1,i+20),1,out);
printf("%d",i);
}
printf("\n");
}
#ifdef __STDC__
static int out(char c)
#else
static int out(c)
char c;
#endif
{
return(putc(c,stdout));
}
static void dump(s)
char *s;
{
if (!s) { printf("(null)\n"); return; }
while (*s)
{
if ((*s < ' ') || (*s > '\176')) printf("\\%03o",(int)*s);
else putc(*s,stdout);
s++;
}
putc('\n',stdout);
}
#endif /* T_TEST */